﻿CMAKE_MINIMUM_REQUIRED(VERSION 3.10)
PROJECT(NFPluginLoader)

AUX_SOURCE_DIRECTORY(. SRC)
ADD_EXECUTABLE(${PROJECT_NAME} ${SRC})

# ============================================================================
# 确保链接依赖关系：所有库必须在链接前编译完成
# ============================================================================
# 注意：依赖关系将通过 ensure_link_dependencies_from_target 自动建立
# 该函数会在 TARGET_LINK_LIBRARIES 之后自动从链接库列表中提取库名并建立依赖关系
# 因此这里不需要手动调用 ensure_link_dependencies

if (CMAKE_BUILD_TYPE STREQUAL "Release")
	# 使用公共核心库列表（定义在 cmake/Dependencies.cmake）
	set(PROJECT_LIBS ${NFSHM_CORE_LIBS})

	# 定义系统库和第三方库（不需要建立依赖关系）
	# 使用公共系统库列表（定义在 cmake/Dependencies.cmake）
	set(SYSTEM_LIBS ${NFSHM_SYSTEM_LIBS})
if(UNIX)
	# 直接链接所有库（使用目标名时，CMake 会自动建立依赖关系）
	TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${PROJECT_LIBS} ${SYSTEM_LIBS})
else(WIN32)
	TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${PROJECT_LIBS} ${SYSTEM_LIBS})
endif()

elseif(CMAKE_BUILD_TYPE STREQUAL "Debug")
	# 使用公共核心库列表（定义在 cmake/Dependencies.cmake）
	set(PROJECT_LIBS ${NFSHM_CORE_LIBS})

	# 定义系统库和第三方库（不需要建立依赖关系）
	# 使用公共系统库列表（定义在 cmake/Dependencies.cmake）
	set(SYSTEM_LIBS ${NFSHM_SYSTEM_LIBS})
if(UNIX)
	# 直接链接所有库（使用目标名时，CMake 会自动建立依赖关系）
	TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${PROJECT_LIBS} ${SYSTEM_LIBS})
else(WIN32)
	TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${PROJECT_LIBS} ${SYSTEM_LIBS})
endif()

elseif (CMAKE_BUILD_TYPE STREQUAL "DynamicRelease")
	# 使用公共核心库列表（定义在 cmake/Dependencies.cmake）
	set(PROJECT_LIBS ${NFSHM_CORE_LIBS})

	# 定义系统库和第三方库（不需要建立依赖关系）
	# 使用公共系统库列表（定义在 cmake/Dependencies.cmake）
	set(SYSTEM_LIBS ${NFSHM_SYSTEM_LIBS})
if(UNIX)
	# 从链接库参数中提取库名并建立依赖关系（在链接之前）
	# 动态库构建也需要确保依赖关系，避免并行编译时的链接错误
	ensure_link_dependencies_from_libs(${PROJECT_NAME} ${PROJECT_LIBS})
	
	# 链接所有库
	TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${PROJECT_LIBS} ${SYSTEM_LIBS})
else(WIN32)
	TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${PROJECT_LIBS} ${SYSTEM_LIBS})
endif()

elseif(CMAKE_BUILD_TYPE STREQUAL "DynamicDebug")
	# 使用公共核心库列表（定义在 cmake/Dependencies.cmake）
	set(PROJECT_LIBS ${NFSHM_CORE_LIBS})

	# 定义系统库和第三方库（不需要建立依赖关系）
	# 使用公共系统库列表（定义在 cmake/Dependencies.cmake）
	set(SYSTEM_LIBS ${NFSHM_SYSTEM_LIBS})
if(UNIX)
	# 从链接库参数中提取库名并建立依赖关系（在链接之前）
	ensure_link_dependencies_from_libs(${PROJECT_NAME} ${PROJECT_LIBS})
	
	# 链接所有库
	TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${PROJECT_LIBS} ${SYSTEM_LIBS})
else(WIN32)
	TARGET_LINK_LIBRARIES(${PROJECT_NAME} ${PROJECT_LIBS} ${SYSTEM_LIBS})
endif()
	set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
endif()

# ============================================================================
# Install 配置
# ============================================================================
# 安装可执行文件到对应的构建类型目录
if (CMAKE_BUILD_TYPE STREQUAL "Release")
    install(TARGETS ${PROJECT_NAME}
            RUNTIME DESTINATION "Bin/Release")
elseif(CMAKE_BUILD_TYPE STREQUAL "Debug")
    install(TARGETS ${PROJECT_NAME}
            RUNTIME DESTINATION "Bin/Debug")
elseif (CMAKE_BUILD_TYPE STREQUAL "DynamicRelease")
    install(TARGETS ${PROJECT_NAME}
            RUNTIME DESTINATION "Bin/DynamicRelease")
elseif(CMAKE_BUILD_TYPE STREQUAL "DynamicDebug")
    install(TARGETS ${PROJECT_NAME}
            RUNTIME DESTINATION "Bin/DynamicDebug")
endif()


